#!/usr/bin/python3

import configparser
import optparse
import os.path
import datetime
import calendar
import time

import classes.requests.anyway as requests
import classes.connects as connects

if __name__ == '__main__':

    config_parser = configparser.SafeConfigParser()
    config_parser.read(os.path.join(os.path.dirname(__file__), 'config.ini'))

    option_parser = optparse.OptionParser()
    option_parser.add_option("--storage-host", type="str", dest="storage_host", default = config_parser.get('storage', 'host'), help="")
    option_parser.add_option("--storage-port", type="int", dest="storage_port", default = config_parser.get('storage', 'port'), help="")
    option_parser.add_option("--storage-user", type="str", dest="storage_user", default = config_parser.get('storage', 'user'), help="")
    option_parser.add_option("--storage-pass", type="str", dest="storage_pass", default = config_parser.get('storage', 'pass'), help="")
    option_parser.add_option("--storage-base", type="str", dest="storage_base", default = config_parser.get('storage', 'base'), help="")
    option_parser.add_option("--path-ingames", type="str", dest="path_ingames", default = config_parser.get('path', 'ingames'), help="")
    option_parser.add_option("--path-archive", type="str", dest="path_archive", default = config_parser.get('path', 'archive'), help="")
    option_parser.add_option("--path-exports", type="str", dest="path_exports", default = config_parser.get('path', 'exports'), help="")
    option_parser.add_option("-s", "--security" , type="float", dest="security", default =  0.5      , help="")
    option_parser.add_option("-c", "--cargo"    , type="long" , dest="cargo"   , default =  10000    , help="")
    option_parser.add_option("-m", "--money"    , type="long" , dest="money"   , default =  100000000, help="")
    option_parser.add_option("-a", "--age"      , type="int"  , dest="age"     , default =  24       , help="Number of hours when orders are considered displaced and are ignored.")
    option_parser.add_option("-w", "--way"      , type="int"  , dest="way"     , default =  3        , help="Number of hours when orders are considered expired and are ignored.")
    option_parser.add_option("-T", "--sort-trip", action="store_const", dest="sort_field", const="profit_per_trip")
    option_parser.add_option("-J", "--sort-jump", action="store_const", dest="sort_field", const="profit_per_jump")
    #@todo: other parameters (tax, fee, now, way, sort_order, min_profits, etc)
    option_parser.set_defaults(sort_field = 'profit_per_jump')
    (options, params) = option_parser.parse_args()

    db = connects.Db(**options.__dict__)

    s = datetime.datetime.now()
    request = requests.AnyWay(db
        ,security = options.security # требуемый уровень безопасности пути (включительно), меньше просто не рассматривать
        ,cargo = options.cargo # объём места в грузовом отсеке (с учётом компрессий и контейнеров)
        ,money = options.money # сколько у нас есть денег в пределе
        ,tax = 0.01 # прикидка на сдирание денег налогами (по факту продажи)
        ,fee = 0.01 # ... брокерами (при постановке на продажу)
        ,now = calendar.timegm(time.gmtime()) # базовое время, которое мы считаем за "сейчас" (для подмены в аргументах потом)
        ,age = options.age * 60 * 60 # за какой период времени рассматривать экспорты (более старые отсеиваем), в днях
        ,way = options.way * 60 * 60 # какое время истчениея у заказа должно быть, чтоб успеть подумать и долететь (запас от now)
        ,sort_field = options.sort_field # сортировка, одно из набора полей в выборке
        ,sort_order = "desc" # сортировка, порядок
        ,min_profit_per_trip = 100000 # минимальный профит
        ,min_profit_per_jump = 100000 # ...
    )

    first = True
    for row in request:
        if first:
            first = False
            e = datetime.datetime.now()
            d = e - s
            print("time=%.6f secs." % (d.days*24*60*60 + d.seconds + d.microseconds/1000000)) 
            print("|S_ORDER_ID|B_ORDER_ID| S_PRICE  | B_PRICE  |AMOUNT|VOLUME|     MONEY|    PROFIT/trip|    PROFIT/jump|Js|SEC|FROM_REGION    |TO_REGION      |FROM_SYSTEM    |TO_SYSTEM      |ITEM_NAME           | EXPORTED |")
        fields = {k:row[k] for k in row.keys()}
        fields['age'] = datetime.timedelta(seconds=fields['age'])
        fields.update(age_days = fields['age'].days, age_hours = round(fields['age'].seconds/60/60), age_minutes = round(fields['age'].seconds/60) % 60)
        print("|%(source_order_id)10d|%(target_order_id)10d|%(source_price)10.2f|%(target_price)10.2f|%(amount)6d|%(volume)6d|%(money)10d|%(profit_per_trip)15d|%(profit_per_jump)15d|%(length)2d|%(security)3.1f|%(source_region_name)-15s|%(target_region_name)-15s|%(source_system_name)-15s|%(target_system_name)-15s|%(item_name)-20s|%(age_days)01dd %(age_hours)02dh %(age_minutes)02dm|"
            % fields)
    if first:
        print("NOTHING FOUND")
